home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1995 October / EnigmA AMIGA RUN 01 (1995)(G.R. Edizioni)(IT)[!][issue 1995-10][Aminet 7].iso / Aminet / misc / emu / prlink_amiga.lha / prlink-0.8.0a / src / prmain.c < prev    next >
C/C++ Source or Header  |  1995-04-04  |  3KB  |  124 lines

  1. /*
  2.  * Main program that combines the previously separate programs prload,
  3.  * prsave, prcart, prsample, prrfile, prwfile, prdisk.
  4.  * 
  5.  * Each of the components can be selected by renaming or linking the
  6.  * executable to one of the names, or by supplying an initial parameter of
  7.  * the form --name.
  8.  */
  9.  
  10. #include <stdio.h>
  11.  
  12. #define __MAIN_C__
  13. #include "prtrans.h"
  14.  
  15. struct program {
  16.     char           *name;
  17.     main_t         *main;
  18. };
  19.  
  20. struct program  plist[] = {
  21.     "prcart",    &main_prcart,
  22.     "prdisk",   &main_prdisk,
  23.     "prload",    &main_prload,
  24.     "prrfile",    &main_prrfile,
  25.     "prsample",    &main_prsample,
  26.     "prsave",    &main_prsave,
  27.     "prwfile",    &main_prwfile,
  28.     NULL, NULL
  29. };
  30.  
  31. struct program *p;
  32.  
  33. int
  34. findmain(int argc, char **argv)
  35. {
  36.     char           *myname = argv[0];
  37.  
  38.     for (p = &plist[0]; p->name; p++) {
  39.     if (strcmp(p->name, myname) == 0) {
  40.         /* Name matches, call appropriate main_ function */
  41.         return (*p->main)(argc, argv);
  42.     }
  43.     }
  44.     p = NULL;
  45.     return -1;
  46. }
  47.  
  48. int
  49. main(int argc, char **argv)
  50. {
  51.     char           *myname = argv[0];
  52.     int             exitcode = -1;
  53.  
  54.     /* First attempt, try first argument */
  55.     if (argc > 1 && argv[1][0] == '-' && argv[1][1] == '-') {
  56.     /* Adjust arguments */
  57.     int             ac = argc - 1;
  58.     char          **av = &argv[1];
  59.  
  60.     av[0] += 2;
  61.     exitcode = findmain(ac, av);
  62.     av[0] -= 2;
  63.     }
  64.  
  65.     if (p == NULL) {
  66.     /* Second, check the name by which we were invoked */
  67.     exitcode = findmain(argc, argv);
  68.     }
  69.  
  70.     if (p == NULL) {
  71.     /* Still no go, thow up hands in despair */
  72.     fprintf(stderr,
  73.         "%s: must specify which function to fulfill, either by renaming the\n"
  74.         "executable or specifying a first argument of --name.\n"
  75.         "Available functions are:\n",
  76.         myname);
  77.     for (p = &plist[0]; p->name; p++) {
  78.         fprintf(stderr, "\t%s\n", p->name);
  79.     }
  80.     }
  81.     return exitcode;
  82. }
  83.  
  84. /*
  85.  * This is not strictly conforming.
  86.  */
  87. int
  88. vmain(main_t *main, int argc, char *argv0,...)
  89. {
  90.     return (*main)(argc, &argv0);
  91. }
  92.  
  93. #if 0
  94. #include <stdarg.h>
  95.  
  96. /*
  97.  * This is strictly conforming but rather inefficient, and makes this
  98.  * whole function rather pointless. We wanted to avoid creating explicit
  99.  * argv[] arrays...
  100.  */
  101. int
  102. vmain(main_t *main, int argc, ...)
  103. {
  104.     char           *av[10];
  105.     int             ac;
  106.     va_list         ap;
  107.  
  108.     if (argc >= 10)
  109.     return -1;        /* too many arguments */
  110.  
  111.     va_start(ap, argc);
  112.  
  113.     for (ac = 0; ac < argc; ac++)
  114.     av[ac] = va_arg(ap, char *);
  115.  
  116.     va_end(ap);
  117.  
  118.     av[argc] = NULL;
  119.  
  120.     return (*main)(argc, av);
  121. }
  122.  
  123. #endif
  124.